#include <fstream>
#include <iostream>
#include <string>
#include <assert.h>
// #include "../src/enum_def.hpp"
using namespace std;

// #define TEST_DEBUG
#define ENUM_CLASS_TEST

#ifdef TEST_DEBUG
#include "../src/enum_def.hpp"

#define ONE 1
#define TWO 2
#define THREE 4
/*
创建一个名叫NUMBER的struct, 默认所有的option类型都是int
定义option_name方法, 每个option使用传入的字面量作为名称 ,
以及定义其他查询函数的主模板  
*/
DECLARE_OPTION_BLOCK(int, NUMBER, ONE, TWO, THREE);
/* 为某个option起一个新名称 */
DECLARE_OPTION_NAME(NUMBER, ONE, "NEW_ONE");
/* 
实现默认的find_option_name方法, 按照传入的变量/常量进行运行期/编译期查询 
*/
DECLARE_FIND_OPTION_NAME_DEFAULT(NUMBER);
/* 
实现默认的find_multi_option_name方法, 按照传入的变量/常量进行运行期/编译期查询 
*/
DECLARE_FIND_MULTI_OPTION_NAME_DEFAULT(NUMBER);

int main() {
    /* 直接寻找对应option的名称 */
    cout << NUMBER::option_name<ONE>() << endl; // NEW_ONE
    cout << NUMBER::option_name<TWO>() << endl; // TWO
    cout << NUMBER::option_name<THREE>() << endl; // THREE

    /* 默认查询所有opiton */
    cout << NUMBER::find_option_name(ONE) << endl; // NEW_ONE
    /* 只查询2,3两个option */
    cout << NUMBER::find_option_name<TWO, THREE>(ONE) << endl; // 空字符串,因为不在查询集合中
    cout << NUMBER::find_option_name<ONE, TWO, THREE>(TWO) << endl; // TWO

    cout << NUMBER::find_multi_option_name(ONE + TWO) << endl; // NEW_ONE|TWO
    cout << NUMBER::find_multi_option_name(0) << endl; // 空字符串 
}
#elif defined(ENUM_CLASS_TEST)
#include "../src/options.h"
// #include "../src/enum_def.hpp"

enum class Number {
    ONE = 1,
    TWO = 2,
    THREE = 3
};

DECLARE_OPTION_BLOCK(Number, NUMBER, Number::ONE, Number::TWO, Number::THREE);
DECLARE_FIND_OPTION_NAME_DEFAULT(NUMBER);


int main() {
    cout << NUMBER::option_name<Number::ONE>() << endl;
    cout << NUMBER::find_option_name(1) << endl;
}

#else

#include "../src/options.h"
// #include "../src/enum_def.hpp"

int main() {
    cout << COMPARE_TYPE::option_name<STRICT_CNSISTENT>() << endl;
    cout << PROBLEM_TYPE::option_name<NORMAL_JUDGE>() << endl;
    cout << COMPARE_TYPE::find_multi_option_name(STRICT_CNSISTENT) << endl;
}

#endif